package DataStructures.Search;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ：ALi
 * @date ：Created in 2021/11/20 16:06
 * @description：插值算法
 * @modified By：
 * @version: $
 */
public class insertSearch {
    public static void main(String[] args) {
        int[] array = {1, 1, 3, 5, 100, 100, 100, 200, 250};
        List<Integer> resList = InsertValueSearch(array, 0, array.length-1, 1);
        System.out.println(resList);
    }

    public static List<Integer> InsertValueSearch(int[] array, int left, int right, int findValue) {
        //这个地方是与二分查找的不同地方。将mide设置为在数组中相对的位置。
        int mide = left + (right - left) * ((findValue - array[left]) / (array[right] - array[left]));
        List<Integer> arrayList = new ArrayList<>();
        //当左下标大于右下标的时候退出
        if (left > right) {
            return null;
        }
        //  向左查找
        if (findValue < array[mide]) {
            InsertValueSearch(array, left, mide - 1, findValue);
        } else if (findValue > array[mide]) {//向右查找
            InsertValueSearch(array, mide + 1, right, findValue);
        } else {
            //刚好相等的时候，找他附近有没有相等的
            arrayList.add(mide);
            int temp;
            //向相等的左边遍历
            if ((mide - 1) >= 0 && array[mide - 1] == findValue) {
                temp = mide - 1;
                while (true) {
                    if (array[temp] != findValue || temp < 0) {
                        break;
                    }
                    arrayList.add(temp);
                    temp--;
                }
            }
            //向相等的右边遍历
            if ((mide + 1) <= right && array[mide + 1] == findValue) {
                temp = mide + 1;
                while (true) {
                    if (array[temp] != findValue || temp > array.length - 1) {
                        break;
                    }
                    arrayList.add(temp);
                    temp++;
                }
            }

        }
        return arrayList;
    }
}